home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- *
- * NSSDC/CDF CDF 'open' operations.
- *
- * Version 1.0, 10-Feb-92, ST Systems (STX)
- *
- * Modification history:
- *
- * V1.0 10-Feb-92, J Love Original version (was part of `cdflib.c').
- *
- ******************************************************************************/
-
- #include "cdflib.h"
-
- /******************************************************************************
- * CDFope.
- ******************************************************************************/
-
- CDFstatus CDFope (ap, item, fnc)
- va_list *ap;
- long item;
- long *fnc;
- {
- CDFstatus Pstatus = CDF_OK;
- CDFstatus Tstatus;
-
- switch (item) {
- case CDF_: {
- CDFid *id;
- char *CDFname;
- char cdfname[CDF_PATHNAME_LEN+1];
- char cdfnameX[CDF_PATHNAME_LEN+4+1]; /* +4+1 for .CDF and NUL-terminator */
- CDFid newid;
- long i, Nbytes;
- File *tmpfp;
- struct cdfSTRUCT *CDF;
-
- CDFname = va_arg (*ap, char *);
- id = va_arg (*ap, CDFid *);
-
- if (strlen(CDFname) > CDF_PATHNAME_LEN) {
- strncpy (cdfname, CDFname, CDF_PATHNAME_LEN);
- cdfname[CDF_PATHNAME_LEN] = NUL;
- STATUSdisp (CDF_NAME_TRUNC, Pstatus);
- }
- else
- strcpy (cdfname, CDFname);
-
- #if defined(vms) /** strip trailing blanks if VMS **/
- for (i = strlen(cdfname) - 1; i >= 0; i--) {
- if (cdfname[i] == ' ')
- cdfname[i] = NUL;
- else
- break;
- }
- #endif
- if ( ! validCDFname(cdfname)) return BAD_CDF_NAME;
-
- /** look for CDFid to use **/
-
- for (newid = 0; newid < CDF_MAX_CDFS; newid++)
- if (_CDFs[newid] == NULL) break;
-
- if (newid == CDF_MAX_CDFS) return TOO_MANY_CDFS;
-
- ExpandPath (cdfname, cdfnameX);
- strcat (cdfnameX,".cdf");
-
- if ( ! IsReg(cdfnameX)) return NO_SUCH_CDF;
-
- #if defined(vms)
- if ( ! fix512(cdfnameX)) return NOT_A_CDF;
- #endif
-
- #if defined(vms) | defined(__MSDOS__)
- tmpfp = OpenFile (cdfnameX,"rb");
- #endif
- #if defined(unix)
- tmpfp = OpenFile (cdfnameX,"r");
- #endif
- if (tmpfp == NULL) return CDF_OPEN_ERROR;
-
- _CDFs[newid] = (struct cdfSTRUCT *) malloc (sizeof(struct cdfSTRUCT));
- if (_CDFs[newid] == NULL) return BAD_MALLOC; /* CLEAN UP! */
-
- CDF = _CDFs[newid];
-
- CDF->status = CDF_READ_ONLY;
- CDF->fp = tmpfp;
- strcpy (CDF->filename, cdfname);
- CDF->id = newid;
-
- /* Fill in CDF data structure */
-
- CDF->varHead = NULL;
- CDF->varTail = NULL;
- for (i = 0; i < CDF_MAX_VARS; i++) CDF->var[i] = NULL;
-
- CDF->attrHead = NULL;
- CDF->attrTail = NULL;
-
- getint32 (CDF->fp, CDF->magic_number);
- if (CDF->magic_number == V2_MAGIC_NUMBER) {
- Tstatus = read_V2_header (CDF);
- STATUSdisp (Tstatus, Pstatus); /* CLEAN UP if ERROR */
- }
- else {
- if (CDF->magic_number == V1_MAGIC_NUMBER_flip) {
- #if defined(vax)
- Tstatus = read_V1_header (CDF);
- STATUSdisp (Tstatus, Pstatus); /* CLEAN UP if ERROR */
- STATUSdisp (VERSION_1_CDF, Pstatus);
- #else
- return V1_CDF_UNSUPPORTED;
- #endif
- }
- else
- return NOT_A_CDF;
- }
-
- CDF->recnum = 0;
- CDF->reccount = 1;
- CDF->recinterval = 1;
-
- if (CDF->GDR.NumDims > 0) {
- Nbytes = CDF->GDR.NumDims * sizeof(long);
-
- CDF->indices = (long *) malloc (Nbytes);
- if (CDF->indices == NULL) return BAD_MALLOC;
- CDF->counts = (long *) malloc (Nbytes);
- if (CDF->counts == NULL) return BAD_MALLOC;
- CDF->intervals = (long *) malloc (Nbytes);
- if (CDF->intervals == NULL) return BAD_MALLOC;
-
- for (i = 0; i < CDF->GDR.NumDims; i++) {
- CDF->indices[i] = 0;
- CDF->counts[i] = CDF->GDR.DimSizes[i];
- CDF->intervals[i] = 1;
- }
- }
- else {
- CDF->indices = NULL;
- CDF->counts = NULL;
- CDF->intervals = NULL;
- }
-
- CDF->CURentryNum = RESERVED_ENTRYNUM;
-
- CDF->CURvar = NULL;
- CDF->CURattr = NULL;
- CDF->CURentry = NULL;
-
- _CURcdf = CDF;
-
- *id = newid;
- break;
- }
- default: {
- *fnc = item;
- break;
- }
- }
- return Pstatus;
- }
-